package dominio;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import xml.adapter.PosicionAdapter;

public class Laberinto{

	public static final Long DURACION_BASE = new Long(10000);
	
	private Integer alto;
	private Integer ancho;
	
	private Integer nodoAncho;
	private Integer nodoAlto;

	private Nodo nodoInicialFantasmas;
	private Nodo nodoInicialPacman;
	
	private Map<String, Nodo> nodos;
	
	
	public Laberinto() {
		this.nodos = new HashMap<String, Nodo>();
	}
	
	public Laberinto(Map<String, Nodo> nodos) {
		this.nodos = nodos;
	}
    
	public Posicion getPosInicialFantasmas() {
		return nodoInicialFantasmas.getPosicion();
	}

	public Posicion getPosInicialPacman() {
		return nodoInicialPacman.getPosicion();
	}

	public Nodo getNodoInicialFantasmas() {
		return nodoInicialFantasmas;
	}

	public void setNodoInicialFantasmas(Nodo nodoInicialFantasma) {
		this.nodoInicialFantasmas = nodoInicialFantasma;
	}

	public Nodo getNodoInicialPacman() {
		return nodoInicialPacman;
	}

	public void setNodoInicialPacman(Nodo nodoInicialPacman) {
		this.nodoInicialPacman = nodoInicialPacman;
	}

	/**
	 * Duracion del efecto de la pastilla en milisegundos
	 * @return
	 */
	public Long getDuracionPastilla() {
		// TODO cambiar segun nivel
		return DURACION_BASE;
	}
	
	/**
	 * Tiempo que tiene que pasar para que un fantasma deje de estar muerto en milisegundos
	 * @return
	 */
	public Long getDuracionFantasmaMuerto() {
		// TODO cambiar segun nivel
		return DURACION_BASE;
	}

	
	public Nodo getNodo(Posicion posicion) {
		String key = PosicionAdapter.adapt(posicion);
		return this.nodos.get(key);
	}
	
	public Boolean terminoPartida() {
		for (Nodo nodo : this.getNodos()) {
			if (nodo.getContiene() != null) {
				return false;
			}
		}
		
		return true;
	}
	
	public Integer getAlto() {
		return alto;
	}

	public void setAlto(Integer alto) {
		this.alto = alto;
	}

	public Integer getAncho() {
		return ancho;
	}

	public void setAncho(Integer ancho) {
		this.ancho = ancho;
	}

	public Integer getNodoAncho() {
		return nodoAncho;
	}

	public void setNodoAncho(Integer nodoAncho) {
		this.nodoAncho = nodoAncho;
	}

	public Integer getNodoAlto() {
		return nodoAlto;
	}

	public void setNodoAlto(Integer nodoAlto) {
		this.nodoAlto = nodoAlto;
	}

	public void addNodo(String key, Nodo nodo) {
		this.nodos.put(key, nodo);
	}
	public Nodo getNodo(String key) {
		return this.nodos.get(key);
	}
	
	public Map<String, Nodo> getNodosMap() {
		return this.nodos;
	}

	public List<Nodo> getNodos() {
		List<Nodo> ret = new ArrayList<Nodo>();
		for (String key : this.nodos.keySet()) {
			ret.add(this.nodos.get(key));
		}
		Collections.sort(ret, new Comparator<Nodo>() {
				@Override
			public int compare(Nodo o1, Nodo o2) {
				String p1 = PosicionAdapter.adapt(o1.getPosicion());
				String p2 = PosicionAdapter.adapt(o2.getPosicion());
				return p1.compareTo(p2);
			}
		});
		return ret;
	}
	
	public String getNodoId(Nodo nodo) {
		for (String key : this.nodos.keySet()) {
			if (this.nodos.get(key).equals(nodo)) {
				return key;
			}
		}
		return null;
	}
}
